/**
 * @file common.h
 * @brief this is a brief description
 * @details this is the detail description.
 * @author fulong 
 * @data 7/4/2014
 * @version 1.0
 * @par Copyright (c):
 * @par First build
 *     version: fulong 
 *     data: 7/4/2014
 */
#ifndef __COMMON_H__
#define __COMMON_H__
#include "../../../hal_include/hal_types.h"


/*!< 从设备能接收帧数据的最大长度 */
#define RECEIVE_MAX_LEN 60

/*!< 响应数据缓冲区的最大长度 */
#define RSP_PUD_MAX_LEN 60

#define RESPOND_ADU_LEST_LEN (1+1+1)
#define NORMAL_ADU_MAX_LEN   (RSP_PUD_MAX_LEN)

#define MODBUS_NONE_EXCEPTION 0
/*----------------typedef----------------------*/
/*!< modbus的异常代码 */
typedef enum {
    INVAILD_FUNCTION = 1,   /*!< 非法功能 */
    INVAILD_ADDR,           /*!< 非法数据地址 */
    INVAILD_DATA,           /*!< 非法数据值 */
    SLAVE_ERROR,            /*!< 从站设备故障 */
    SLAVE_OK,               /*!< 确认,以防止,从站处理时间超过默认超时时间. */
    SLAVE_BUSY,             /*!< 从设备忙 */
    ODD_ERROR,              /*!< 存储奇偶性差错 */
    GATE_UNAVAILABE = 10,   /*!< 网关路径不可用 */
    GATE_RSP_FAIL           /*!< 网关目标设备响应失败 */
}except_code;

typedef enum {
    VERIFY_SUCCESS,
    VERIFY_FAIL
}verify_status;
typedef enum{
    READ_COIL_STATUS=1,
    READ_INPUT_STATUS,
    READ_HOLDING_REGS,
    READ_INPUT_REGS,
    FORCE_SINGLE_COIL,
    PRESET_SINGLE_REG,
    READ_EXCEPTION_STATUS,
    FETCH_COMM_EVENT_CTR=11,
    FETCH_COMM_EVENT_LOG,
    FORCE_MULTIPLE_COIL=15,
    FORCE_MULTIPLE_REGS,
    REPORT_SLAVE_ID,
    READ_GENERAL_REF=20,
    WRITE_GENERAL_REF,
    MASK_WRITE_4X_REG,
    READ_WRITE_4X_REGS,
    READ_FIFO_QUEUE

}public_function_code;
typedef enum{
    user
}uesr_function_code;


typedef enum{
    reserve
}reserve_fnuction_code;
/*!< modbus请求pdu */
typedef struct {
    uint8 function_code;
    uint8 request_data_len;
    uint8 *request_data;
}mb_req_pdu_struct;
/*!< modbus响应pdu */
typedef struct {
    uint8 function_code; /*!< modbus的功能码 */
    uint8 request_data_len;
    uint8 *response_data; /*!< 这个字段与功能码有关,并且通常包括诸如变量引用,变量计数,数据偏移,子功能码等信息 */
}mb_rsp_pdu_struct;
/*!< modbsu异常响应pdu */
typedef struct {
    uint8 exception_function_code; /*!< modbus功能码+0x80 */
    uint8 exception_code;  /*!< @see except_code */
}mb_excep_rsp_pdu_struct;
/*!< modbus请求的adu格式 */
typedef struct {
    uint8 addr;
    mb_req_pdu_struct mb_req_pdu;
    uint8 verifaction_high8;
    uint8 verifaction_low8;
}mb_adu_struct;

/*!< 设备的接收发送操作 */
typedef struct {
    void (*modbus_init)(void);
    void (*modbus_receive)(void);
    void (*modbus_send)(void);
    uint8(*adjust_verify)(mb_adu_struct *mb_adu);
    void(*normal_rsp)(mb_rsp_pdu_struct*);
    void(*except_rsp)(mb_excep_rsp_pdu_struct*);
    void(*receive_frame_function)(const uint8);
}modbus_operation_struct;

typedef struct {
    uint8 data_process_done;
    uint8 mb_status;
    uint8 mb_exception_code;
    uint8 mb_frame_len;
    mb_adu_struct *mb_adu;
}mb_status_struct;
typedef struct {
    uint8 receive_frame_done;
    uint8 frame_len;
    uint8 receive_frame[RECEIVE_MAX_LEN+1+2];
}receive_frame_struct;
/*!< @see modbus_operation_struct */
extern modbus_operation_struct modbus_operation;

extern void modbus_process(void);
extern void modbus_receive(void);
extern void modbus_start_configure(void);
extern void reset_rsp_status(void);
extern uint8 get_rsp_status(void) ;

#endif /* __COMMON_H__ */


